
/**
 * 排序算法模板
 */

abstract class SortTemplate {
    // 具体的排序算法
    public static sort:  (arr: any[]) => void;

    /**
     * v 是否小于 w
     * @param v 第一个参数 
     * @param w 第二个参数
     */
    private static less (v: any, w: any) {
        const types = ['number', 'string'];
        if (types.includes(typeof v) || types.includes(typeof v.valueOf())) {
            return v.valueOf() < w.valueOf();
        } else {
            throw new TypeError('该类型不支持比较大小');
        }
    }
    
    /**
     * 交换 i 和 j 处的位置
     * @param a 数组
     * @param i 索引
     * @param j 索引
     */
    private static exch (a: any[], i: number, j: number) {
        const t = a[i];
        a[i] = a[j];
        a[j] = t;
    }

    private static show (a: any[]) {
        for (let i = 0; i < a.length; i++) {
            console.log(`第${i}元素：${a[i]}`);
        }
    }

    private static isSorted (a: any[]): boolean {
        for (let i = 1; i < a.length; i++) {
            if (SortTemplate.less(a[i], a[i-1])) {
                return false;
            }
        }
    }
}